FUNCTION_BLOCK "Inverter_Control" { S7_Optimized_Access := 'TRUE' } VERSION : 0.1 VAR_INPUT HW_Address : HW_ANY; // 硬件地址 Forward : Bool := FALSE; // 正转 Reverse : Bool := FALSE; // 反转 OFF2 : Bool := TRUE; // 惯性停车 OFF3 : Bool := TRUE; // 快速停车 Acknowledge : Bool := FALSE; // 错误确认 Setpoint_Speed : Real := 0.0; // 设定速度 Reference_Speed : Real := 50.0; // 参考速度 END_VAR VAR_OUTPUT Actual_Speed : Real := 0.0; // 实际速度 Fault : Bool := FALSE; // 故障 Warning : Bool := FALSE; // 警告 Offline : Bool := FALSE; // 通讯掉线 END_VAR VAR Send : Struct // 发送数据区 Reserve_1 : Bool := FALSE; // 预留 Reserve_2 : Bool := FALSE; // 预留 Master_Control_PLC : Bool := TRUE; // p854[0]:通过PLC控制/不通过PLC控制 Direction : Bool := FALSE; // p1113[0]:设定值取反 Reserve_3 : Bool := FALSE; // 预留 MOP_Up : Bool := FALSE; // p1035[0]:电动电位器设定值增加 MOP_Down : Bool := FALSE; // p1036[0]:电动电位器设定值减小 Reserve_4 : Bool := FALSE; // 预留 OFF1 : Bool := FALSE; // p840[0]:ON/OFF(OFF1) OFF2 : Bool := TRUE; // p844[0]:无缓慢停转/缓慢停转(OFF2)信号源 1 OFF3 : Bool := TRUE; // p848[0]:无快速停止/快速停止(OFF3)信号源 1 Enable : Bool := TRUE; // p852[0]:使能运行/禁止运行 Ramp_Fuction_Enable : Bool := TRUE; // p1140[0]:使能斜坡函数发生器/禁止斜坡函数发生器 Continue_Ramp : Bool := TRUE; // p1141[0]:继续斜坡函数发生器/冻结斜坡函数发生器 Setponit_Enable : Bool := TRUE; // p1142[0]:使能设定值/禁止设定值 Acknowledge : Bool := FALSE; // p2103[0]:应答故障 Speed_Setpoint : Int; // p1070[0]:主设定值 User_Define_1 : Int; // [用户自定义] User_Define_2 : Int; // [用户自定义] User_Define_3 : Int; // [用户自定义] User_Define_4 : Int; // [用户自定义] END_STRUCT; Recevie : Struct // 接收数据区 Speed_Reached : Bool := FALSE; // 设定/实际转速偏差[0=是,1=否] Control_Requested : Bool := FALSE; // 控制请求[0=否,1=是] Overspeed : Bool := TRUE; // 达到最大转速[0=否,1=是] Current_Limit : Bool := FALSE; // 达到I,M,P极限[0=是,1=否] Holding_Brake : Bool := FALSE; // 电机抱闸打开[0=否,1=是] Motor_Overload : Bool := FALSE; // 电机超温报警[0=是,1=否] Direction : Bool := FALSE; // 电机正向旋转[0=否,1=是] Inverter_Overload : Bool := FALSE; // 变频器过载报警[0=是,1=否] Ready : Bool := FALSE; // 接通就绪[0=否,1=是] Ready_to_Run : Bool := TRUE; // 运行就绪[0=否,1=是] Running : Bool := FALSE; // 运行使能[0=否,1=是] Fault : Bool := TRUE; // 存在故障[0=否,1=是] OFF2_Active : Bool := TRUE; // 缓慢停转当前有效[0=是,1=否] OFF3_Active : Bool := TRUE; // 快速停止当前有效[0=是,1=否] Inhibit_Active : Bool := TRUE; // 接通禁止当前有效[0=否,1=是] Warning : Bool := FALSE; // 存在报警[0=否,1=是] Actual_Speed : Int := 0; // r63[1]:转速实际值(经过p0045滤波) Actual_Current : Int := 0; // r68[1]:电流实际值的绝对值(经过p0045滤波) Actual_Torque : Int := 0; // r80[1]:转矩实际值(经过p0045滤波) Warning_Code : Word := 0; // r2132:当前报警代码 Fault_Code : Word := 0; // r2131:当前报警代码 END_STRUCT; END_VAR VAR RETAIN Record : Struct // 记录数据区 Warning_Enable : Bool := TRUE; // 警告输出启用 Warning_Code : Word := 0; // r2132:当前报警代码记录值 Fault_Code : Word := 0; // r2131:当前故障代码记录值 END_STRUCT; END_VAR VAR GETIO_Instance {OriginalPartName := 'GETIO'; LibVersion := '1.0'} : GETIO; // 读取过程映像 SETIO_Instance {OriginalPartName := 'SETIO'; LibVersion := '1.1'} : SETIO; // 传送过程映像 END_VAR VAR RETAIN Current_Parameters : Struct // 电流参数 Actual_Current : Real; // 电流当前值 Reference_Current { S7_SetPoint := 'True'} : Real := 100.0; // 电流参考值 END_STRUCT; Torque_Parameters : Struct // 扭矩参数 Actual_Torque : Real; // 扭矩当前值 Reference_Torque { S7_SetPoint := 'True'} : Real := 100.0; // 扭矩参考值 END_STRUCT; END_VAR VAR Diagnostic_Status : Struct // 通讯状态 Communicate_Fault : Bool; // 通讯故障 Drive_Deactive : Bool; // 禁用 Error : Bool; // 调用函数故障 Return_Value : Int; // 调用函数故障字 END_STRUCT; END_VAR VAR_TEMP Drive_Diagnostic : Int; // 驱动器诊断 CNT_DIAG : UInt; Diagnostic_Information {OriginalPartName := 'DIS'; LibVersion := '1.0'} : DIS; // 驱动器诊断信息 END_VAR BEGIN (* 读取过程映像 *) #GETIO_Instance(ID := #HW_Address, INPUTS := #Recevie); (* 初始化 *) #Send.Master_Control_PLC := TRUE; #Send.Enable := TRUE; #Send.Ramp_Fuction_Enable := TRUE; #Send.Continue_Ramp := TRUE; #Send.Setponit_Enable := TRUE; (* 启动停止 *) #Send.OFF1 := ((#Forward AND NOT #Reverse) OR (#Reverse OR #Forward)) AND #Recevie.Ready AND NOT #Recevie.Fault AND NOT #Diagnostic_Status.Communicate_Fault; (* 方向选择 *) #Send.Direction := #Reverse AND NOT #Forward; (* 缓慢停止 *) #Send.OFF2 := #OFF2; (* 快速停止 *) #Send.OFF3 := #OFF3; (* 驱动器故障 *) IF #Recevie.Fault AND #Recevie.Fault_Code <> 16#0 THEN #Record.Fault_Code := #Recevie.Fault_Code; END_IF; #Fault := #Recevie.Fault; (* 驱动器警告 *) IF #Recevie.Warning AND #Recevie.Warning_Code <> 16#0 THEN #Record.Warning_Code := #Recevie.Warning_Code; END_IF; #Warning := #Recevie.Warning AND #Record.Warning_Enable; (* 故障确认 *) #Send.Acknowledge := #Acknowledge; (* 实际速度 *) #Actual_Speed := INT_TO_REAL(#Recevie.Actual_Speed) / 16384.0 * #Reference_Speed; (* 实际电流 *) #Current_Parameters.Actual_Current := INT_TO_REAL(#Recevie.Actual_Current) / 16384.0 * #Current_Parameters.Reference_Current; (* 实际扭矩 *) #Torque_Parameters.Actual_Torque := INT_TO_REAL(#Recevie.Actual_Torque) / 16384.0 * #Torque_Parameters.Reference_Torque; (* 设定速度 *) IF #Reference_Speed <> 0.0 THEN #Send.Speed_Setpoint := LIMIT(MN := -32768, IN := REAL_TO_INT(#Setpoint_Speed * 16384.0 / #Reference_Speed), MX := 32767); ELSE #Send.Speed_Setpoint := 0; END_IF; (* 传送过程映像 *) #SETIO_Instance(ID := #HW_Address, OUTPUTS := #Send); (* 传送过程映像 *) #Drive_Diagnostic := GET_DIAG(MODE := 1, LADDR := #HW_Address, CNT_DIAG => #CNT_DIAG, DIAG := #Diagnostic_Information); (* 驱动器诊断 *) IF #Drive_Diagnostic >= 0 THEN #Diagnostic_Status.Error := FALSE; #Diagnostic_Status.Return_Value := 0; IF #Diagnostic_Information.OwnState = 16#1 THEN #Diagnostic_Status.Drive_Deactive := TRUE; #Diagnostic_Status.Communicate_Fault := FALSE; ELSE #Diagnostic_Status.Drive_Deactive := FALSE; IF #Diagnostic_Information.OwnState = 16#5 THEN #Diagnostic_Status.Communicate_Fault := TRUE; ELSE #Diagnostic_Status.Communicate_Fault := FALSE; END_IF; END_IF; ELSE #Diagnostic_Status.Error := TRUE; #Diagnostic_Status.Return_Value := #Drive_Diagnostic; #Diagnostic_Status.Communicate_Fault := FALSE; #Diagnostic_Status.Drive_Deactive := FALSE; END_IF; (* 驱动器通讯掉线 *) #Offline := #Diagnostic_Status.Communicate_Fault; END_FUNCTION_BLOCK